WebAssembly ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค๋ฅผ ํ์ํ๊ณ ๋ค์ค ๋ฐํ ๊ฐ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ์ฌ ์ฑ๋ฅ ๋ฐ ๊ฐ๋ฐ์ ๊ฒฝํ์ ํฅ์์ํค๋ ๋ฐฉ๋ฒ์ ์์๋ด ๋๋ค.
WebAssembly ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค: ๋ค์ค ๋ฐํ ๊ฐ ์ต์ ํ
WebAssembly(Wasm)๋ ์น ๊ฐ๋ฐ ๋ฐ ๊ทธ ์ด์์ ํ์ ํ์ฌ ๋ธ๋ผ์ฐ์ ๋ฐ ๊ธฐํ ํ๊ฒฝ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฑฐ์ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค. Wasm์ ํจ์จ์ฑ๊ณผ ํํ๋ ฅ์ ํฅ์์ํค๋ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค์ ๋๋ค. ์ด๋ฅผ ํตํด ํจ์๋ ์ฌ๋ฌ ๊ฐ์ ์ง์ ๋ฐํํ ์ ์์ผ๋ฏ๋ก ์์๋ฐฉํธ์ด ํ์ ์๊ณ ์ ์ฒด ์ฝ๋ ์คํ์ด ๊ฐ์ ๋ฉ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ WebAssembly์ ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ , ์ด์ ๊ณผ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ์ค์ ์์ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebAssembly ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค๋ ๋ฌด์์ ๋๊น?
์ ํต์ ์ผ๋ก ์ด๊ธฐ ๋ฒ์ ์ JavaScript๋ฅผ ํฌํจํ ๋ง์ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ํจ์๋ ๋จ์ผ ๊ฐ๋ง ๋ฐํํ๋๋ก ์ ํ๋์์ต๋๋ค. ์ด๋ฌํ ์ ํ์ผ๋ก ์ธํด ๊ฐ๋ฐ์๋ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๋ฑ ์ฌ๋ฌ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ๋ฐํํ๊ธฐ ์ํด ๊ฐ์ ์ ์ธ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์์ต๋๋ค. ์ด๋ฌํ ์์๋ฐฉํธ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ๋ฐ์ดํฐ ์กฐ์์ผ๋ก ์ธํด ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ์ต๋๋ค. WebAssembly์์ ํ์คํ๋ ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค๋ ์ด๋ฌํ ์ ํ์ ์ง์ ์ ์ผ๋ก ํด๊ฒฐํฉ๋๋ค.
๋ค์ค ๊ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด WebAssembly ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋์์ ๋ฐํํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋๊ฐ ๋จ์ํ๋๊ณ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ์ค์ด๋ค๋ฉฐ ์ปดํ์ผ๋ฌ์ ๊ฐ์ ๋จธ์ ์ด ์ด๋ฌํ ๊ฐ์ ์ฒ๋ฆฌ๋ฅผ ์ต์ ํํ ์ ์๋๋ก ํ์ฌ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ๊ฐ์ ๋จ์ผ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด๋ก ํจํค์งํ๋ ๋์ ํจ์๋ ์๋ช ์์ ์ฌ๋ฌ ๋ฐํ ์ ํ์ ๊ฐ๋จํ ์ ์ธํ ์ ์์ต๋๋ค.
๋ค์ค ๊ฐ ๋ฐํ์ ์ด์
์ฑ๋ฅ ์ต์ ํ
๋ค์ค ๊ฐ ๋ฐํ์ ์ฃผ์ ์ด์ ์ ์ฑ๋ฅ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ค๋ฅ ์ฝ๋๋ฅผ ๋ชจ๋ ๋ฐํํด์ผ ํ๋ ํจ์๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ๋ค์ค ๊ฐ ๋ฐํ์ด ์์ผ๋ฉด ๋ ๊ฐ์ ๋ชจ๋ ์ ์ฅํ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ ค๋ฉด ๊ฐ์ฒด์ ๋ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ , ํด๋น ์์ฑ์ ๊ฐ์ ํ ๋นํ ๋ค์, ํจ์ ํธ์ถ ํ์ ํด๋น ๊ฐ์ ๊ฒ์ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ชจ๋ ๋จ๊ณ์์ CPU ์ฃผ๊ธฐ๊ฐ ์๋น๋ฉ๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ๊ฐ ๋ ์ง์คํฐ ๋๋ ์คํ์์ ์ด๋ฌํ ๊ฐ์ ์ง์ ๊ด๋ฆฌํ์ฌ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ์ค๋ฒํค๋๋ฅผ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ํนํ ์ฑ๋ฅ์ด ์ค์ํ ์ฝ๋ ์น์ ์์ ์คํ ์๊ฐ์ด ๋นจ๋ผ์ง๊ณ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ด ์ค์ด๋ญ๋๋ค.
์: ๋ค์ค ๊ฐ ๋ฐํ์ด ์๋ ๊ฒฝ์ฐ(JavaScript์ ์ ์ฌํ ์)
function processData(input) {
// ... ์ผ๋ถ ์ฒ๋ฆฌ ๋ก์ง ...
return { result: resultValue, error: errorCode };
}
const outcome = processData(data);
if (outcome.error) {
// ์ค๋ฅ ์ฒ๋ฆฌ
}
const result = outcome.result;
์: ๋ค์ค ๊ฐ ๋ฐํ์ด ์๋ ๊ฒฝ์ฐ(WebAssembly์ ์ ์ฌํ ์)
(func $processData (param $input i32) (result i32 i32)
;; ... ์ผ๋ถ ์ฒ๋ฆฌ ๋ก์ง ...
(return $resultValue $errorCode)
)
(local $result i32)
(local $error i32)
(call $processData $data)
(local.tee $error)
(local.set $result)
(if (local.get $error) (then ;; ์ค๋ฅ ์ฒ๋ฆฌ))
WebAssembly ์์ ์์ $processData ํจ์๋ ๋ ๊ฐ์ i32 ๊ฐ์ ๋ฐํํ๋ฉฐ, ์ด๋ ๋ก์ปฌ ๋ณ์ $result ๋ฐ $error์ ์ง์ ํ ๋น๋ฉ๋๋ค. ์ค๊ฐ ๊ฐ์ฒด ํ ๋น์ด ์์ผ๋ฏ๋ก ํจ์ฌ ๋ ํจ์จ์ ์
๋๋ค.
ํฅ์๋ ์ฝ๋ ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ
๋ค์ค ๊ฐ ๋ฐํ์ ์ฝ๋๋ฅผ ๋ ๊น๋ํ๊ณ ์ดํดํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์์ ๊ฐ์ ์์ถ ํด์ ํ ํ์ ์์ด ๋ฐํ ๊ฐ์ ํจ์ ์๋ช ์ ๋ช ์์ ์ผ๋ก ์ ์ธ๋๊ณ ๋ณ์์ ์ง์ ํ ๋นํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ฝ๋ ๋ช ํ์ฑ์ด ํฅ์๋๊ณ ์ค๋ฅ ๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ์ค์ด๋ญ๋๋ค. ๊ฐ๋ฐ์๋ ๊ตฌํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์์ธํ ์ดํด๋ณด์ง ์๊ณ ๋ ํจ์๊ฐ ๋ฌด์์ ๋ฐํํ๋์ง ๋น ๋ฅด๊ฒ ์๋ณํ ์ ์์ต๋๋ค.
์: ํฅ์๋ ์ค๋ฅ ์ฒ๋ฆฌ
๊ฐ๊ณผ ์ค๋ฅ ์ฝ๋ ๋๋ ์ฑ๊ณต/์คํจ ํ๋๊ทธ๋ฅผ ๋ชจ๋ ๋ฐํํ๋ ๊ฒ์ ์ผ๋ฐ์ ์ธ ํจํด์ ๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ์ด ํจํด์ ํจ์ฌ ๋ ๋ฉ์ง๊ฒ ๋ง๋ญ๋๋ค. ์์ธ๋ฅผ throwํ๊ฑฐ๋(๋น์ฉ์ด ๋ง์ด ๋ค ์ ์์) ์ ์ญ ์ค๋ฅ ์ํ์ ์์กดํ๋ ๋์ ํจ์๋ ๊ฒฐ๊ณผ์ ์ค๋ฅ ํ์๊ธฐ๋ฅผ ๊ณ ์ ํ ๊ฐ์ผ๋ก ๋ฐํํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ํธ์ถ์๋ ์ค๋ฅ ํ์๊ธฐ๋ฅผ ์ฆ์ ํ์ธํ๊ณ ํ์ํ ์ค๋ฅ ์กฐ๊ฑด์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
ํฅ์๋ ์ปดํ์ผ๋ฌ ์ต์ ํ
์ปดํ์ผ๋ฌ๋ ๋ค์ค ๊ฐ ๋ฐํ์ ์ฒ๋ฆฌํ ๋ ๋ ๋์ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ๋ฐํํ๋ค๋ ๊ฒ์ ์๋ฉด ์ปดํ์ผ๋ฌ๋ ๋ ์ง์คํฐ๋ฅผ ๋ ํจ์จ์ ์ผ๋ก ํ ๋นํ๊ณ ๋จ์ผ ๋ณตํฉ ๋ฐํ ๊ฐ์ผ๋ก๋ ๋ถ๊ฐ๋ฅํ ๋ค๋ฅธ ์ต์ ํ๋ฅผ ์ํํ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๋ฐํ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์์ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด์ ๋ง๋ค์ง ์์๋ ๋๋ฏ๋ก ๋ ํจ์จ์ ์ธ ์ฝ๋ ์์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋จ์ํ๋ ์ํธ ์ด์ฉ์ฑ
๋ค์ค ๊ฐ ๋ฐํ์ WebAssembly์ ๋ค๋ฅธ ์ธ์ด ๊ฐ์ ์ํธ ์ด์ฉ์ฑ์ ๋จ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด JavaScript์์ WebAssembly ํจ์๋ฅผ ํธ์ถํ ๋ ๋ค์ค ๊ฐ ๋ฐํ์ JavaScript์ ๊ตฌ์กฐ ๋ถํด ํ ๋น ๊ธฐ๋ฅ์ ์ง์ ๋งคํํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ๊ฐ๋ฐ์๋ ์์ถ ํด์ ๋ฅผ ์ํ ๋ณต์กํ ์ฝ๋๋ฅผ ์์ฑํ์ง ์๊ณ ๋ ๋ฐํ ๊ฐ์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ๋ค๋ฅธ ์ธ์ด ๋ฐ์ธ๋ฉ๋ ๋ค์ค ๊ฐ ๋ฐํ์ ์ฌ์ฉํ์ฌ ๋จ์ํํ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ์์
์ํ ๋ฐ ๋ฌผ๋ฆฌํ ์๋ฎฌ๋ ์ด์
๋ง์ ์ํ ๋ฐ ๋ฌผ๋ฆฌํ ์๋ฎฌ๋ ์ด์ ์๋ ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ฌ ๊ฐ์ ๋ฐํํ๋ ํจ์๊ฐ ํฌํจ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ ์ ์ ๊ต์ฐจ์ ์ ๊ณ์ฐํ๋ ํจ์๋ ๊ต์ฐจ์ ์ x ๋ฐ y ์ขํ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๋ฐฉ์ ์ ์์คํ ์ ํธ๋ ํจ์๋ ์ฌ๋ฌ ์๋ฃจ์ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ์ค๊ฐ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ง ์๊ณ ๋ ํจ์๊ฐ ๋ชจ๋ ์๋ฃจ์ ๊ฐ์ ์ง์ ๋ฐํํ ์ ์์ผ๋ฏ๋ก ์ด๋ฌํ ์๋๋ฆฌ์ค์ ์ด์์ ์ ๋๋ค.
์: ์ ํ ๋ฐฉ์ ์ ์์คํ ํ๊ธฐ
๋ฏธ์ง์๊ฐ 2๊ฐ์ธ 2๊ฐ์ ์ ํ ๋ฐฉ์ ์ ์์คํ ์ ํธ๋ ๊ฐ๋จํ ์๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. x ๋ฐ y์ ๋ํ ์๋ฃจ์ ์ ๋ฐํํ๋ ํจ์๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
(func $solveLinearSystem (param $a i32 $b i32 $c i32 $d i32 $e i32 $f i32) (result i32 i32)
;; ๋ค์ ์์คํ
์ ํด๊ฒฐํฉ๋๋ค.
;; a*x + b*y = c
;; d*x + e*y = f
;; (๋จ์ํ๋ ์, 0์ผ๋ก ๋๋๊ธฐ์ ๋ํ ์ค๋ฅ ์ฒ๋ฆฌ ์์)
(local $det i32)
(local $x i32)
(local $y i32)
(local.set $det (i32.sub (i32.mul (local.get $a) (local.get $e)) (i32.mul (local.get $b) (local.get $d))))
(local.set $x (i32.div_s (i32.sub (i32.mul (local.get $c) (local.get $e)) (i32.mul (local.get $b) (local.get $f))) (local.get $det)))
(local.set $y (i32.div_s (i32.sub (i32.mul (local.get $a) (local.get $f)) (i32.mul (local.get $c) (local.get $d))) (local.get $det)))
(return (local.get $x) (local.get $y))
)
์ด๋ฏธ์ง ๋ฐ ์ ํธ ์ฒ๋ฆฌ
์ด๋ฏธ์ง ๋ฐ ์ ํธ ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์๋ ์ฌ๋ฌ ๊ตฌ์ฑ ์์ ๋๋ ํต๊ณ๋ฅผ ๋ฐํํ๋ ํจ์๊ฐ ํฌํจ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฏธ์ง์ ์์ ํ์คํ ๊ทธ๋จ์ ๊ณ์ฐํ๋ ํจ์๋ ๋นจ๊ฐ, ๋ น์ ๋ฐ ํ๋ ์ฑ๋์ ๋ํ ๋น๋์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ํธ๋ฆฌ์ ๋ถ์์ ์ํํ๋ ํจ์๋ ๋ณํ์ ์ค์ ๋ฐ ํ์ ๊ตฌ์ฑ ์์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ํตํด ์ด๋ฌํ ํจ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋จ์ผ ๊ฐ์ฒด ๋๋ ๋ฐฐ์ด๋ก ํจํค์งํ ํ์ ์์ด ๋ชจ๋ ๊ด๋ จ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐํํ ์ ์์ต๋๋ค.
๊ฒ์ ๊ฐ๋ฐ
๊ฒ์ ๊ฐ๋ฐ์์ ํจ์๋ ๊ฒ์ ์ํ, ๋ฌผ๋ฆฌํ ๋๋ AI์ ๊ด๋ จ๋ ์ฌ๋ฌ ๊ฐ์ ์์ฃผ ๋ฐํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ฒด ๊ฐ์ ์ถฉ๋ ์๋ต์ ๊ณ์ฐํ๋ ํจ์๋ ๋ ๊ฐ์ฒด์ ์ ์์น์ ์๋๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. AI ์์ด์ ํธ์ ์ต์ ์ด๋์ ๊ฒฐ์ ํ๋ ํจ์๋ ์ํํ ์์ ๊ณผ ์ ๋ขฐ ์ ์๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ์ด๋ฌํ ์์ ์ ๊ฐ์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉฐ ์ฝ๋๋ฅผ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์: ๋ฌผ๋ฆฌํ ์๋ฎฌ๋ ์ด์ - ์ถฉ๋ ๊ฐ์ง
์ถฉ๋ ๊ฐ์ง ํจ์๋ ์ถฉ๋ํ๋ ๋ ๊ฐ์ฒด์ ์ ๋ฐ์ดํธ๋ ์์น์ ์๋๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค.
(func $collideObjects (param $x1 f32 $y1 f32 $vx1 f32 $vy1 f32 $x2 f32 $y2 f32 $vx2 f32 $vy2 f32)
(result f32 f32 f32 f32 f32 f32 f32 f32)
;; ๋จ์ํ๋ ์ถฉ๋ ๊ณ์ฐ(์์ ๋ง ํด๋น)
(local $newX1 f32)
(local $newY1 f32)
(local $newVX1 f32)
(local $newVY1 f32)
(local $newX2 f32)
(local $newY2 f32)
(local $newVX2 f32)
(local $newVY2 f32)
;; ... ์ฌ๊ธฐ์ ์ถฉ๋ ๋ก์ง์ด ์์ผ๋ฉฐ ๋ก์ปฌ ๋ณ์ ์
๋ฐ์ดํธ ...
(return (local.get $newX1) (local.get $newY1) (local.get $newVX1) (local.get $newVY1)
(local.get $newX2) (local.get $newY2) (local.get $newVX2) (local.get $newVY2))
)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ๋ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์์ ์๋ ํจ์๊ฐ ์ฌ๋ฌ ์ ๋ณด๋ฅผ ๋ฐํํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ ์ฝ๋๋ฅผ ๊ฒ์ํ๋ ํจ์๋ ๋ ์ฝ๋์ ์ฌ๋ฌ ํ๋ ๊ฐ์ ๋ฐํํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฅผ ์ง๊ณํ๋ ํจ์๋ ํฉ๊ณ, ํ๊ท ๋ฐ ํ์ค ํธ์ฐจ์ ๊ฐ์ ์ฌ๋ฌ ์์ฝ ํต๊ณ๋ฅผ ๋ฐํํ ์ ์์ต๋๋ค. ๋ค์ค ๊ฐ ๋ฐํ์ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๋ง๋ค ํ์์ฑ์ ์์ ์ ์ด๋ฌํ ์์ ์ ๋จ์ํํ๊ณ ์ฑ๋ฅ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
๊ตฌํ ์ธ๋ถ ์ ๋ณด
WebAssembly ํ ์คํธ ํ์(WAT)
WebAssembly ํ
์คํธ ํ์(WAT)์์ ๋ค์ค ๊ฐ ๋ฐํ์ ๋ฐํ ์ ํ ๋ชฉ๋ก์ด ๋ค๋ฐ๋ฅด๋ (result ...) ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ์๋ช
์์ ์ ์ธ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ ๊ฐ์ 32๋นํธ ์ ์๋ฅผ ๋ฐํํ๋ ํจ์๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ธ๋ฉ๋๋ค.
(func $myFunction (param $input i32) (result i32 i32)
;; ... ํจ์ ๋ณธ๋ฌธ ...
)
์ฌ๋ฌ ๋ฐํ ๊ฐ์ด ์๋ ํจ์๋ฅผ ํธ์ถํ ๋ ํธ์ถ์๋ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ๋ก์ปฌ ๋ณ์๋ฅผ ํ ๋นํด์ผ ํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ call ๋ช
๋ น์ ํจ์ ์๋ช
์ ์ ์ธ๋ ์์๋๋ก ์ด๋ฌํ ๋ก์ปฌ ๋ณ์๋ฅผ ๋ฐํ ๊ฐ์ผ๋ก ์ฑ์๋๋ค.
JavaScript API
JavaScript์์ WebAssembly ๋ชจ๋๊ณผ ์ํธ ์์ฉํ ๋ ๋ค์ค ๊ฐ ๋ฐํ์ JavaScript ๋ฐฐ์ด๋ก ์๋ ๋ณํ๋ฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ๋ฐ์๋ ๋ฐฐ์ด ๊ตฌ์กฐ ๋ถํด๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ณ ๋ฐํ ๊ฐ์ ์ฝ๊ฒ ์ก์ธ์คํ ์ ์์ต๋๋ค.
const wasmModule = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
const { myFunction } = wasmModule.instance.exports;
const [result1, result2] = myFunction(input);
console.log(result1, result2);
์ปดํ์ผ๋ฌ ์ง์
Emscripten, Rust ๋ฐ AssemblyScript์ ๊ฐ์ด WebAssembly๋ฅผ ๋์์ผ๋ก ํ๋ ๋๋ถ๋ถ์ ์ต์ ์ปดํ์ผ๋ฌ๋ ๋ค์ค ๊ฐ ๋ฐํ์ ์ง์ํฉ๋๋ค. ์ด๋ฌํ ์ปดํ์ผ๋ฌ๋ ๋ค์ค ๊ฐ ๋ฐํ์ ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ WebAssembly ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ฏ๋ก ๊ฐ๋ฐ์๋ ๋ฎ์ ์์ค์ WebAssembly ์ฝ๋๋ฅผ ์ง์ ์์ฑํ์ง ์๊ณ ๋ ์ด ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์์ต๋๋ค.
๋ค์ค ๊ฐ ๋ฐํ ์ฌ์ฉ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
- ๋ค์ค ๊ฐ ๋ฐํ์ ์ ์ ํ๊ฒ ์ฌ์ฉํ์ญ์์ค. ๋ชจ๋ ๊ฒ์ ๋ค์ค ๊ฐ ๋ฐํ์ผ๋ก ๊ฐ์ ํ์ง ๋ง๊ณ ํจ์๊ฐ ์์ฐ์ค๋ฝ๊ฒ ์ฌ๋ฌ ๋ ๋ฆฝ์ ์ธ ๊ฐ์ ์์ฑํ ๋ ๊ณ ๋ คํ์ญ์์ค.
- ๋ฐํ ์ ํ์ ๋ช ํํ๊ฒ ์ ์ํ์ญ์์ค. ์ฝ๋ ๊ฐ๋ ์ฑ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ํจ์ ์๋ช ์์ ํญ์ ๋ฐํ ์ ํ์ ๋ช ์์ ์ผ๋ก ์ ์ธํ์ญ์์ค.
- ์ค๋ฅ ์ฒ๋ฆฌ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ๋ค์ค ๊ฐ ๋ฐํ์ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ์ ์ค๋ฅ ์ฝ๋ ๋๋ ์ํ ํ์๊ธฐ๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐํํ์ญ์์ค.
- ์ฑ๋ฅ์ ๋ง๊ฒ ์ต์ ํํ์ญ์์ค. ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ ์ค์ด๊ณ ์คํ ์๋๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ฝ๋์ ์ฑ๋ฅ์ด ์ค์ํ ์น์ ์์ ๋ค์ค ๊ฐ ๋ฐํ์ ์ฌ์ฉํ์ญ์์ค.
- ์ฝ๋ ๋ฌธ์๋ฅผ ์์ฑํ์ญ์์ค. ๋ค๋ฅธ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์๋๋ก ๊ฐ ๋ฐํ ๊ฐ์ ์๋ฏธ๋ฅผ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค.
์ ํ ์ฌํญ ๋ฐ ๊ณ ๋ ค ์ฌํญ
๋ค์ค ๊ฐ ๋ฐํ์ ์๋นํ ์ด์ ์ ์ ๊ณตํ์ง๋ง ๋ช ์ฌํด์ผ ํ ๋ช ๊ฐ์ง ์ ํ ์ฌํญ๊ณผ ๊ณ ๋ ค ์ฌํญ์ด ์์ต๋๋ค.
- ๋๋ฒ๊น : ๋๋ฒ๊น ์ด ๋ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋๊ตฌ๋ ์ฌ๋ฌ ๋ฐํ ๊ฐ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํ๊ณ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค.
- ๋ฒ์ ํธํ์ฑ: ์ฌ์ฉ ์ค์ธ WebAssembly ๋ฐํ์ ๋ฐ ๋๊ตฌ๊ฐ ๋ค์ค ๊ฐ ๊ธฐ๋ฅ์ ์์ ํ ์ง์ํ๋์ง ํ์ธํ์ญ์์ค. ์ด์ ๋ฐํ์์์๋ ์ง์ํ์ง ์์ ํธํ์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
WebAssembly ๋ฐ ๋ค์ค ๊ฐ ๋ฐํ์ ๋ฏธ๋
๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค๋ WebAssembly ์งํ์ ์ค์ํ ๋จ๊ณ์ ๋๋ค. WebAssembly๊ฐ ๊ณ์ ๋ฐ์ ํ๊ณ ๋ ๋๋ฆฌ ์ฑํ๋จ์ ๋ฐ๋ผ ๋ค์ค ๊ฐ ๋ฐํ ์ฒ๋ฆฌ์์ ์ถ๊ฐ์ ์ธ ๊ฐ์ ๊ณผ ์ต์ ํ๊ฐ ์ด๋ฃจ์ด์ง ๊ฒ์ผ๋ก ์์ํ ์ ์์ต๋๋ค. ํฅํ ๊ฐ๋ฐ์๋ ๋ณด๋ค ์ ๊ตํ ์ปดํ์ผ๋ฌ ์ต์ ํ, ๋ ๋์ ๋๋ฒ๊น ๋๊ตฌ ๋ฐ ๋ค๋ฅธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์์ ํฅ์๋ ํตํฉ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
WebAssembly๋ ๊ณ์ํด์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๊ณ ์์ต๋๋ค. ์์ฝ์์คํ ์ด ์ฑ์ํจ์ ๋ฐ๋ผ ๊ฐ๋ฐ์๋ ๋ ๋ง์ ๋๊ตฌ, ๋ ๋์ ์ปดํ์ผ๋ฌ ์ต์ ํ ๋ฐ ๋ค๋ฅธ ์์ฝ์์คํ (์: Node.js ๋ฐ ์๋ฒ๋ฆฌ์ค ํ๋ซํผ)๊ณผ์ ๋ ๊น์ ํตํฉ์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ์ด๋ ๋ค์ค ๊ฐ ๋ฐํ ๋ฐ ๊ธฐํ ๊ณ ๊ธ WebAssembly ๊ธฐ๋ฅ์ด ํจ์ฌ ๋ ๋๋ฆฌ ์ฑํ๋ ๊ฒ์์ ์๋ฏธํฉ๋๋ค.
๊ฒฐ๋ก
WebAssembly ๋ค์ค ๊ฐ ํจ์ ์ธํฐํ์ด์ค๋ ๊ฐ๋ฐ์๊ฐ ๋ ํจ์จ์ ์ด๊ณ ์ฝ๊ธฐ ์ฝ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋๋ก ํ๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ๋๋ค. ํจ์๊ฐ ์ฌ๋ฌ ๊ฐ์ ์ง์ ๋ฐํํ ์ ์๋๋ก ํจ์ผ๋ก์จ ์์๋ฐฉํธ์ ํ์์ฑ์ ์์ ๊ณ ์ ์ฒด ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์ , ๊ฒ์, ์๋ฎฌ๋ ์ด์ ๋๋ ๊ธฐํ ์ ํ์ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ค์ค ๊ฐ ๋ฐํ์ ์ฌ์ฉํ์ฌ ์ฝ๋๋ฅผ ์ต์ ํํ๊ณ WebAssembly์ ๊ธฐ๋ฅ์ ์ต๋ํ ํ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ฌ๋ฐ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ฑ๊ณผ ํํ๋ ฅ์ ํฌ๊ฒ ํฅ์์์ผ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ๊ฒฝํ์ ์ ๊ณตํจ์ผ๋ก์จ ์ ์ธ๊ณ ์ต์ข ์ฌ์ฉ์์๊ฒ ์ด์ต์ด ๋ ๊ฒ์ ๋๋ค.